package com.ds.core.util;

import java.util.regex.Pattern;

public class MarkUtil {

	public static String htmlToText(String source) {
		Pattern p=Pattern.compile("<(\\S*?)[^>]*>.*?|<.*? />|\\n|&nbsp;");
		String[] rss=p.split(source);
		StringBuffer sb=new StringBuffer();
		for (int i = 0; i < rss.length; i++) {
			sb.append(rss[i]);
		}
		String rs=sb.toString();
		rs=rs.replace("&lt;", "<")
				.replace("&gt;", ">")
				.replaceAll("\r\n|\r|\n|\n\r|\t", "").replace(" ", "");
		return rs;
	}


	public static void main(String[] args) {
		String str="<div class=\"iteye-blog-content-contain\">\r\n" + 
				"<p style=\"font-size: 14px;\">&nbsp; &nbsp; Mybatis-Plus是一个Mybatis的增强工具，它在Mybatis的基础上做了增强，却不做改变。我们在使用Mybatis-Plus之后既可以使用Mybatis-Plus的特有功能，又能够正常使用Mybatis的原生功能。Mybatis-Plus(以下简称MP)是为简化开发、提高开发效率而生，但它也提供了一些很有意思的插件，比如SQL性能监控、乐观锁、执行分析等。</p>\r\n" + 
				"<p style=\"font-size: 14px;\">&nbsp; &nbsp; Mybatis虽然已经给我们提供了很大的方便，但它还是有不足之处，实际上没有什么东西是完美的，MP的存在就是为了稍稍弥补Mybatis的不足。在我们使用Mybatis时会发现，每当要写一个业务逻辑的时候都要在DAO层写一个方法，再对应一个SQL，即使是简单的条件查询、即使仅仅改变了一个条件都要在DAO层新增一个方法，针对这个问题，MP就提供了一个很好的解决方案，之后我会进行介绍。另外，MP的代码生成器也是一个很有意思的东西，它可以让我们避免许多重复性的工作，下面我将介绍如何在你的项目中集成MP。</p>\r\n" + 
				"<p style=\"font-size: 14px;\"><span style=\"font-size: 18px; color: #ff0000;\">集成步骤&darr;：(首先，你要有个spring项目)</span></p>\r\n" + 
				"<ol>\r\n" + 
				"<li style=\"font-size: 14px;\">集成依赖，pom中加入依赖即可，不多说：\r\n" + 
				"<pre name=\"code\" class=\"java\">		&lt;!-- mybatis mybatis-plus mybatis-spring mvc --&gt;\r\n" + 
				"		&lt;dependency&gt;\r\n" + 
				"			&lt;groupId&gt;com.baomidou&lt;/groupId&gt;\r\n" + 
				"			&lt;artifactId&gt;mybatis-plus&lt;/artifactId&gt;\r\n" + 
				"			&lt;version&gt;${mybatis-plus.version}&lt;/version&gt;\r\n" + 
				"		&lt;/dependency&gt;\r\n" + 
				"		&lt;dependency&gt;\r\n" + 
				"			&lt;groupId&gt;org.apache.velocity&lt;/groupId&gt;\r\n" + 
				"			&lt;artifactId&gt;velocity-engine-core&lt;/artifactId&gt;\r\n" + 
				"			&lt;version&gt;2.0&lt;/version&gt;\r\n" + 
				"		&lt;/dependency&gt;</pre>\r\n" + 
				"&nbsp;说明：笔者使用的版本为：mybatis-plus.version=2.1-gamma，上边的代码中有两个依赖，第一个是mybatis-plus核心依赖，第二个是使用代码生成器时需要的模板引擎依赖，若果你不打算使用代码生成器，此处可不引入。\r\n" + 
				"<p><span style=\"color: #ff0000;\">注意：mybatis-plus的核心jar包中已集成了mybatis和mybatis-spring，所以为避免冲突，请勿再次引用这两个jar包。</span></p>\r\n" + 
				"</li>\r\n" + 
				"<li style=\"font-size: 14px;\"><span style=\"color: #000000;\"><span style=\"color: #000000;\">在spring中配置MP：</span></span>\r\n" + 
				"<pre name=\"code\" class=\"java\">	&lt;bean id=\"sqlSessionFactory\"\r\n" + 
				"		class=\"com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean\"&gt;\r\n" + 
				"		&lt;!-- 配置数据源 --&gt;\r\n" + 
				"		&lt;property name=\"dataSource\" ref=\"dataSource\" /&gt;\r\n" + 
				"		&lt;!-- 自动扫描 Xml 文件位置 --&gt;\r\n" + 
				"		&lt;property name=\"mapperLocations\" value=\"classpath*:com/ds/orm/mapper/**/*.xml\" /&gt;\r\n" + 
				"		&lt;!-- 配置 Mybatis 配置文件（可无） --&gt;\r\n" + 
				"		&lt;property name=\"configLocation\" value=\"classpath:mybatis-config.xml\" /&gt;\r\n" + 
				"		&lt;!-- 配置包别名，支持通配符 * 或者 ; 分割 --&gt;\r\n" + 
				"		&lt;property name=\"typeAliasesPackage\" value=\"com.ds.orm.model\" /&gt;\r\n" + 
				"		&lt;!-- 枚举属性配置扫描，支持通配符 * 或者 ; 分割 --&gt;\r\n" + 
				"		&lt;!-- &lt;property name=\"typeEnumsPackage\" value=\"com.baomidou.springmvc.entity.*.enums\" \r\n" + 
				"			/&gt; --&gt;\r\n" + 
				"		&lt;!-- 以上配置和传统 Mybatis 一致 --&gt;\r\n" + 
				"\r\n" + 
				"		&lt;!-- MP 全局配置注入 --&gt;\r\n" + 
				"		&lt;property name=\"globalConfig\" ref=\"globalConfig\" /&gt;\r\n" + 
				"	&lt;/bean&gt;\r\n" + 
				"\r\n" + 
				"	&lt;!-- 定义 MP 全局策略 --&gt;\r\n" + 
				"	&lt;bean id=\"globalConfig\" class=\"com.baomidou.mybatisplus.entity.GlobalConfiguration\"&gt;\r\n" + 
				"		&lt;!-- 主键策略配置 --&gt;\r\n" + 
				"		&lt;!-- 可选参数 AUTO-&gt;`0`(\"数据库ID自增\") INPUT-&gt;`1`(用户输入ID\") ID_WORKER-&gt;`2`(\"全局唯一ID\") \r\n" + 
				"			UUID-&gt;`3`(\"全局唯一ID\") --&gt;\r\n" + 
				"		&lt;property name=\"idType\" value=\"2\" /&gt;\r\n" + 
				"		&lt;!-- 数据库类型配置 --&gt;\r\n" + 
				"		&lt;!-- 可选参数（默认mysql） MYSQL-&gt;`mysql` ORACLE-&gt;`oracle` DB2-&gt;`db2` H2-&gt;`h2` \r\n" + 
				"			HSQL-&gt;`hsql` SQLITE-&gt;`sqlite` POSTGRE-&gt;`postgresql` SQLSERVER2005-&gt;`sqlserver2005` \r\n" + 
				"			SQLSERVER-&gt;`sqlserver` --&gt;\r\n" + 
				"		&lt;property name=\"dbType\" value=\"mysql\" /&gt;\r\n" + 
				"		&lt;!-- 全局表为下划线命名设置 true --&gt;\r\n" + 
				"		&lt;property name=\"dbColumnUnderline\" value=\"true\" /&gt;\r\n" + 
				"		&lt;property name=\"sqlInjector\"&gt;\r\n" + 
				"			&lt;bean class=\"com.baomidou.mybatisplus.mapper.AutoSqlInjector\" /&gt;\r\n" + 
				"		&lt;/property&gt;\r\n" + 
				"	&lt;/bean&gt;\r\n" + 
				"	&lt;bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"&gt;\r\n" + 
				"		&lt;description&gt;DAO接口所在包名，Spring会自动查找其下的类&lt;/description&gt;\r\n" + 
				"		&lt;property name=\"basePackage\" value=\"com.ds.orm.mapper\" /&gt;\r\n" + 
				"		&lt;property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\" /&gt;\r\n" + 
				"	&lt;/bean&gt;\r\n" + 
				"	&lt;!-- 乐观锁插件 --&gt;\r\n" + 
				"	&lt;bean class=\"com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor\" /&gt;\r\n" + 
				"\r\n" + 
				"	&lt;!-- xml mapper热加载 sqlSessionFactory:session工厂 mapperLocations:mapper匹配路径 \r\n" + 
				"		enabled:是否开启动态加载 默认:false delaySeconds:项目启动延迟加载时间 单位：秒 默认:10s sleepSeconds:刷新时间间隔 \r\n" + 
				"		单位：秒 默认:20s --&gt;\r\n" + 
				"	&lt;bean class=\"com.baomidou.mybatisplus.spring.MybatisMapperRefresh\"&gt;\r\n" + 
				"		&lt;constructor-arg name=\"sqlSessionFactory\" ref=\"sqlSessionFactory\" /&gt;\r\n" + 
				"		&lt;constructor-arg name=\"mapperLocations\"\r\n" + 
				"			value=\"classpath*:com/ds/orm/mapper/*/*.xml\" /&gt;\r\n" + 
				"		&lt;constructor-arg name=\"delaySeconds\" value=\"10\" /&gt;\r\n" + 
				"		&lt;constructor-arg name=\"sleepSeconds\" value=\"20\" /&gt;\r\n" + 
				"		&lt;constructor-arg name=\"enabled\" value=\"true\" /&gt;\r\n" + 
				"	&lt;/bean&gt;\r\n" + 
				"\r\n" + 
				"	&lt;!-- 事务 --&gt;\r\n" + 
				"	&lt;bean id=\"transactionManager\"\r\n" + 
				"		class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"&gt;\r\n" + 
				"		&lt;property name=\"dataSource\" ref=\"dataSource\" /&gt;\r\n" + 
				"	&lt;/bean&gt;\r\n" + 
				"	&lt;tx:annotation-driven transaction-manager=\"transactionManager\"\r\n" + 
				"		proxy-target-class=\"true\" /&gt;</pre>\r\n" + 
				"<span style=\"color: #000000;\"><span style=\"color: #000000;\">&nbsp;<span style=\"color: #ff0000;\">注意：只要做如上配置就可以正常使用mybatis了，不要重复配置。MP的配置和mybatis一样，都是配置一个</span></span></span><span style=\"color: #ff0000;\">sqlSessionFactory，只是现在所配置的类在原本的SqlSessionFactoryBean基础上做了增强。插件等配置请按需取舍。</span></li>\r\n" + 
				"<li style=\"font-size: 14px;\"><span style=\"color: #000000;\"><span style=\"color: #000000;\">插件配置，按需求配置就可以，此处把可以配置的插件都列了出来，具体的请看代码注释：</span></span>\r\n" + 
				"<pre name=\"code\" class=\"java\">&lt;configuration&gt;\r\n" + 
				"	&lt;settings&gt;\r\n" + 
				"		&lt;setting name=\"logImpl\" value=\"SLF4J\" /&gt;\r\n" + 
				"		&lt;!-- 字段为空时仍调用model的set方法或map的put方法 --&gt;\r\n" + 
				"		&lt;setting name=\"callSettersOnNulls\" value=\"true\" /&gt;\r\n" + 
				"	&lt;/settings&gt;\r\n" + 
				"	&lt;plugins&gt;\r\n" + 
				"		&lt;!-- | 分页插件配置 | 插件提供二种方言选择：1、默认方言 2、自定义方言实现类，两者均未配置则抛出异常！ | overflowCurrent \r\n" + 
				"			溢出总页数，设置第一页 默认false | optimizeType Count优化方式 （ 版本 2.0.9 改为使用 jsqlparser 不需要配置 \r\n" + 
				"			） | --&gt;\r\n" + 
				"		&lt;!-- 注意!! 如果要支持二级缓存分页使用类 CachePaginationInterceptor 默认、建议如下！！ --&gt;\r\n" + 
				"		&lt;plugin interceptor=\"com.baomidou.mybatisplus.plugins.PaginationInterceptor\"&gt;\r\n" + 
				"			&lt;property name=\"dialectType\" value=\"mysql\" /&gt;\r\n" + 
				"			&lt;!--&lt;property name=\"sqlParser\" ref=\"自定义解析类、可以没有\" /&gt;\r\n" + 
				"			&lt;property name=\"localPage\" value=\"默认 false 改为 true 开启了 pageHeper 支持、可以没有\" /&gt;\r\n" + 
				"			&lt;property name=\"dialectClazz\" value=\"自定义方言类、可以没有\" /&gt; --&gt;\r\n" + 
				"		&lt;/plugin&gt;\r\n" + 
				"\r\n" + 
				"		&lt;!-- SQL 执行性能分析，开发环境使用，线上不推荐。 maxTime 指的是 sql 最大执行时长 --&gt;\r\n" + 
				"		&lt;plugin interceptor=\"com.baomidou.mybatisplus.plugins.PerformanceInterceptor\"&gt;\r\n" + 
				"			&lt;property name=\"maxTime\" value=\"2000\" /&gt;\r\n" + 
				"			&lt;!--SQL是否格式化 默认false --&gt;\r\n" + 
				"			&lt;property name=\"format\" value=\"true\" /&gt;\r\n" + 
				"		&lt;/plugin&gt;\r\n" + 
				"\r\n" + 
				"		&lt;!-- SQL 执行分析拦截器 stopProceed 发现全表执行 delete update 是否停止运行 该插件只用于开发环境，不建议生产环境使用。。。 --&gt;\r\n" + 
				"		&lt;plugin interceptor=\"com.baomidou.mybatisplus.plugins.SqlExplainInterceptor\"&gt;\r\n" + 
				"			&lt;property name=\"stopProceed\" value=\"false\" /&gt;\r\n" + 
				"		&lt;/plugin&gt;\r\n" + 
				"	&lt;/plugins&gt;\r\n" + 
				"&lt;/configuration&gt;</pre>\r\n" + 
				"<span style=\"color: #000000;\">&nbsp;<span style=\"color: #ff0000;\">注意：</span></span><span style=\"color: #ff0000;\">执行分析拦截器和性能分析推荐只在开发时调试程序使用，为保证程序性能和稳定性，建议在生产环境中注释掉这两个插件。</span></li>\r\n" + 
				"<li>数据源：(此处使用druid)\r\n" + 
				"<pre name=\"code\" class=\"java\">	&lt;!-- 配置数据源 --&gt;\r\n" + 
				"	&lt;bean name=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\" init-method=\"init\" destroy-method=\"close\"&gt;\r\n" + 
				"		&lt;!--		&lt;property name=\"driverClassName\" value=\"${jdbc.driverClassName}\" /&gt; --&gt;\r\n" + 
				"		&lt;property name=\"url\" value=\"${jdbc.url}\" /&gt; \r\n" + 
				"		&lt;property name=\"username\" value=\"${jdbc.username}\" /&gt; \r\n" + 
				"		&lt;property name=\"password\" value=\"${jdbc.password}\" /&gt; \r\n" + 
				"		&lt;property name=\"initialSize\" value=\"${jdbc.initialSize}\" /&gt; \r\n" + 
				"		&lt;property name=\"minIdle\" value=\"${jdbc.minIdle}\" /&gt; \r\n" + 
				"		&lt;property name=\"maxActive\" value=\"${jdbc.maxActive}\" /&gt; \r\n" + 
				"		&lt;property name=\"maxWait\" value=\"${jdbc.maxWait}\" /&gt; \r\n" + 
				"		&lt;property name=\"timeBetweenEvictionRunsMillis\" value=\"${jdbc.timeBetweenEvictionRunsMillis}\" /&gt; \r\n" + 
				"		&lt;property name=\"minEvictableIdleTimeMillis\" value=\"${jdbc.minEvictableIdleTimeMillis}\" /&gt; \r\n" + 
				"		&lt;property name=\"validationQuery\" value=\"${jdbc.validationQuery}\" /&gt; \r\n" + 
				"		&lt;property name=\"testWhileIdle\" value=\"${jdbc.testWhileIdle}\" /&gt; \r\n" + 
				"		&lt;property name=\"testOnBorrow\" value=\"${jdbc.testOnBorrow}\" /&gt; \r\n" + 
				"		&lt;property name=\"testOnReturn\" value=\"${jdbc.testOnReturn}\" /&gt; \r\n" + 
				"		&lt;property name=\"removeAbandoned\" value=\"${jdbc.removeAbandoned}\" /&gt; \r\n" + 
				"		&lt;property name=\"removeAbandonedTimeout\" value=\"${jdbc.removeAbandonedTimeout}\" /&gt; \r\n" + 
				"		&lt;!--	    &lt;property name=\"logAbandoned\" value=\"${jdbc.logAbandoned}\" /&gt; --&gt;\r\n" + 
				"		&lt;property name=\"filters\" value=\"${jdbc.filters}\" /&gt;\r\n" + 
				"		&lt;!-- 关闭abanded连接时输出错误日志 --&gt;\r\n" + 
				"		&lt;property name=\"logAbandoned\" value=\"true\" /&gt;\r\n" + 
				"		&lt;property name=\"proxyFilters\"&gt;\r\n" + 
				"			&lt;list&gt;\r\n" + 
				"				&lt;ref bean=\"log-filter\"/&gt;\r\n" + 
				"			&lt;/list&gt;\r\n" + 
				"		&lt;/property&gt;\r\n" + 
				"\r\n" + 
				"		&lt;!-- 监控数据库 --&gt;\r\n" + 
				"		&lt;!-- &lt;property name=\"filters\" value=\"stat\" /&gt; --&gt;\r\n" + 
				"		&lt;!--		&lt;property name=\"filters\" value=\"mergeStat\" /&gt;--&gt;\r\n" + 
				"	&lt;/bean&gt;</pre>\r\n" + 
				"</li>\r\n" + 
				"</ol>\r\n" + 
				"<p style=\"font-size: 14px;\"><span style=\"color: #ff0000; font-size: 36px;\">到此，MP已经集成进我们的项目中了，下面将介绍它是如何简化我们的开发的。</span></p>\r\n" + 
				"<p style=\"font-size: 14px;\">&nbsp;</p>\r\n" + 
				"<span style=\"font-size: 18px; color: #ff0000;\">简单的CURD操作&darr;：</span></div>\r\n" + 
				"<div class=\"iteye-blog-content-contain\">假设我们有一张user表，且已经建立好了一个与此表对应的实体类User，我们来介绍对user的简单增删改查操作。<br /><ol>\r\n" + 
				"<li>建立DAO层接口。我们在使用普通的mybatis时会建立一个DAO层接口，并对应一个xml用来写SQL。在这里我们同样要建立一个DAO层接口，但是若无必要，我们甚至不需要建立xml，就可以进行资源的CURD操作了，我们只需要让我们建立的DAO继承MP提供的BaseMapper&lt;?&gt;即可：\r\n" + 
				"<pre name=\"code\" class=\"java\">public interface UserMapper extends BaseMapper&lt;User&gt; { }</pre>\r\n" + 
				"&nbsp;然后在我们需要做数据CURD时，像下边这样就好了：\r\n" + 
				"<pre name=\"code\" class=\"java\">// 初始化 影响行数\r\n" + 
				"int result = 0;\r\n" + 
				"// 初始化 User 对象\r\n" + 
				"User user = new User();\r\n" + 
				"\r\n" + 
				"// 插入 User (插入成功会自动回写主键到实体类)\r\n" + 
				"user.setName(\"Tom\");\r\n" + 
				"result = userMapper.insert(user);\r\n" + 
				"\r\n" + 
				"// 更新 User\r\n" + 
				"user.setAge(18);\r\n" + 
				"result = userMapper.updateById(user);//user要设置id哦，具体的在下边我会详细介绍\r\n" + 
				"\r\n" + 
				"// 查询 User\r\n" + 
				"User exampleUser = userMapper.selectById(user.getId());\r\n" + 
				"\r\n" + 
				"// 查询姓名为&lsquo;张三&rsquo;的所有用户记录\r\n" + 
				"List&lt;User&gt; userList = userMapper.selectList(\r\n" + 
				"        new EntityWrapper&lt;User&gt;().eq(\"name\", \"张三\")\r\n" + 
				");\r\n" + 
				"\r\n" + 
				"// 删除 User\r\n" + 
				"result = userMapper.deleteById(user.getId());</pre>\r\n" + 
				"<span style=\"color: #ff0000;\">&nbsp;方便吧？如果只使用mybatis可是要写4个SQL和4个方法喔，当然了，仅仅上边这几个方法还远远满足不了我们的需求，请往下看：</span></li>\r\n" + 
				"<li>多条件分页查询：\r\n" + 
				"<pre name=\"code\" class=\"java\">// 分页查询 10 条姓名为&lsquo;张三&rsquo;、性别为男，且年龄在18至50之间的用户记录\r\n" + 
				"List&lt;User&gt; userList = userMapper.selectPage(\r\n" + 
				"        new Page&lt;User&gt;(1, 10),\r\n" + 
				"        new EntityWrapper&lt;User&gt;().eq(\"name\", \"张三\")\r\n" + 
				"                .eq(\"sex\", 0)\r\n" + 
				"                .between(\"age\", \"18\", \"50\")\r\n" + 
				");\r\n" + 
				"\r\n" + 
				"/**等价于SELECT *\r\n" + 
				"*FROM sys_user\r\n" + 
				"*WHERE (name='张三' AND sex=0 AND age BETWEEN '18' AND '50')\r\n" + 
				"*LIMIT 0,10\r\n" + 
				"*/</pre>\r\n" + 
				"&nbsp;下边这个，多条件构造器。其实对于条件过于复杂的查询，笔者还是建议使用原生mybatis的方式实现，易于维护且逻辑清晰，如果所有的数据操作都强行使用MP，就失去了MP简化开发的意义了。所以在使用时请按实际情况取舍，在这里还是先介绍一下。\r\n" + 
				"<pre name=\"code\" class=\"java\">public Page&lt;T&gt; selectPage(Page&lt;T&gt; page, EntityWrapper&lt;T&gt; entityWrapper) {\r\n" + 
				"  if (null != entityWrapper) {\r\n" + 
				"      entityWrapper.orderBy(page.getOrderByField(), page.isAsc());//排序\r\n" + 
				"  }\r\n" + 
				"  page.setRecords(baseMapper.selectPage(page, entityWrapper));//将查询结果放入page中\r\n" + 
				"  return page;\r\n" + 
				"}</pre>\r\n" + 
				"&nbsp;条件构造一(上边方法的entityWrapper参数)：<br />\r\n" + 
				"<pre name=\"code\" class=\"java\">public void testTSQL11() {\r\n" + 
				"    /*\r\n" + 
				"     * 实体带查询使用方法  输出看结果\r\n" + 
				"     */\r\n" + 
				"    EntityWrapper&lt;User&gt; ew = new EntityWrapper&lt;User&gt;();\r\n" + 
				"    ew.setEntity(new User(1));\r\n" + 
				"    ew.where(\"user_name={0}\", \"'zhangsan'\").and(\"id=1\")\r\n" + 
				"            .orNew(\"user_status={0}\", \"0\").or(\"status=1\")\r\n" + 
				"            .notLike(\"user_nickname\", \"notvalue\")\r\n" + 
				"            .andNew(\"new=xx\").like(\"hhh\", \"ddd\")\r\n" + 
				"            .andNew(\"pwd=11\").isNotNull(\"n1,n2\").isNull(\"n3\")\r\n" + 
				"            .groupBy(\"x1\").groupBy(\"x2,x3\")\r\n" + 
				"            .having(\"x1=11\").having(\"x3=433\")\r\n" + 
				"            .orderBy(\"dd\").orderBy(\"d1,d2\");\r\n" + 
				"    System.out.println(ew.getSqlSegment());\r\n" + 
				"}</pre>\r\n" + 
				"&nbsp;&nbsp;条件构造二（同上）：\r\n" + 
				"<pre name=\"code\" class=\"java\">int buyCount = selectCount(Condition.create()\r\n" + 
				"                .setSqlSelect(\"sum(quantity)\")\r\n" + 
				"                .isNull(\"order_id\")\r\n" + 
				"                .eq(\"user_id\", 1)\r\n" + 
				"                .eq(\"type\", 1)\r\n" + 
				"                .in(\"status\", new Integer[]{0, 1})\r\n" + 
				"                .eq(\"product_id\", 1)\r\n" + 
				"                .between(\"created_time\", startDate, currentDate)\r\n" + 
				"                .eq(\"weal\", 1));</pre>\r\n" + 
				"&nbsp;自定义条件使用entityWrapper：\r\n" + 
				"<pre name=\"code\" class=\"java\">List&lt;User&gt; selectMyPage(RowBounds rowBounds, @Param(\"ew\") Wrapper&lt;T&gt; wrapper);</pre>\r\n" + 
				"&nbsp;\r\n" + 
				"<pre name=\"code\" class=\"xml\">&lt;select id=\"selectMyPage\" resultType=\"User\"&gt;\r\n" + 
				"  SELECT * FROM user \r\n" + 
				"  &lt;where&gt;\r\n" + 
				"  ${ew.sqlSegment}\r\n" + 
				"  &lt;/where&gt;\r\n" + 
				"&lt;/select&gt;</pre>\r\n" + 
				"&nbsp;<span style=\"color: #ff0000;\">注意：此处不用担心SQL注入，MP已对ew做了字符串转义处理。</span></li>\r\n" + 
				"</ol>\r\n" + 
				"<p>其实在使用MP做数据CURD时，还有另外一个方法，AR(ActiveRecord&nbsp;)，很简单，让我们的实体类继承MP提供Model&lt;?&gt;就好了，这和我们常用的方法可能会有些不同，下边简单说一下吧：</p>\r\n" + 
				"<pre name=\"code\" class=\"java\">//实体类\r\n" + 
				"@TableName(\"sys_user\") // 注解指定表名\r\n" + 
				"public class User extends Model&lt;User&gt; {\r\n" + 
				"\r\n" + 
				"  ... // fields\r\n" + 
				"\r\n" + 
				"  ... // getter and setter\r\n" + 
				"\r\n" + 
				"  /** 指定主键 */\r\n" + 
				"  @Override\r\n" + 
				"  protected Serializable pkVal() {  //一定要指定主键哦\r\n" + 
				"      return this.id;\r\n" + 
				"  }\r\n" + 
				"}</pre>\r\n" + 
				"&nbsp;下边就是CURD操作了：\r\n" + 
				"<pre name=\"code\" class=\"java\">// 初始化 成功标识\r\n" + 
				"boolean result = false;\r\n" + 
				"// 初始化 User\r\n" + 
				"User user = new User();\r\n" + 
				"\r\n" + 
				"// 保存 User\r\n" + 
				"user.setName(\"Tom\");\r\n" + 
				"result = user.insert();\r\n" + 
				"\r\n" + 
				"// 更新 User\r\n" + 
				"user.setAge(18);\r\n" + 
				"result = user.updateById();\r\n" + 
				"\r\n" + 
				"// 查询 User\r\n" + 
				"User exampleUser = t1.selectById();\r\n" + 
				"\r\n" + 
				"// 查询姓名为&lsquo;张三&rsquo;的所有用户记录\r\n" + 
				"List&lt;User&gt; userList1 = user.selectList(\r\n" + 
				"        new EntityWrapper&lt;User&gt;().eq(\"name\", \"张三\")\r\n" + 
				");\r\n" + 
				"\r\n" + 
				"// 删除 User\r\n" + 
				"result = t2.deleteById();</pre>\r\n" + 
				"&nbsp;\r\n" + 
				"<pre name=\"code\" class=\"java\">// 分页查询 10 条姓名为&lsquo;张三&rsquo;、性别为男，且年龄在18至50之间的用户记录\r\n" + 
				"List&lt;User&gt; userList = user.selectPage(\r\n" + 
				"        new Page&lt;User&gt;(1, 10),\r\n" + 
				"        new EntityWrapper&lt;User&gt;().eq(\"name\", \"张三\")\r\n" + 
				"                .eq(\"sex\", 0)\r\n" + 
				"                .between(\"age\", \"18\", \"50\")\r\n" + 
				").getRecords();</pre>\r\n" + 
				"<span style=\"color: #ff0000;\">&nbsp;就是这样了，可能你会说MP封装的有些过分了，这样做会分散数据逻辑到不同的层面中，难以管理，使代码难以理解。其实确实是这样，这就需要你在使用的时候注意一下了，在简化开发的同时也要保证你的代码层次清晰，做一个战略上的设计或者做一个取舍与平衡。</span>\r\n" + 
				"<p>&nbsp;</p>\r\n" + 
				"</div>\r\n" + 
				"<div class=\"iteye-blog-content-contain\"><span style=\"color: #ff0000; font-size: 36px;\">其实上边介绍的功能也不是MP的全部啦，下边介绍一下MP最有意思的模块&mdash;&mdash;代码生成器。</span></div>\r\n" + 
				"<div class=\"iteye-blog-content-contain\"><span style=\"font-size: 18px; color: #ff0000;\">步骤&darr;：</span></div>\r\n" + 
				"<div class=\"iteye-blog-content-contain\"><ol>\r\n" + 
				"<li><span style=\"color: #000000;\">如上边所说，使用代码生成器一定要引入</span>velocity-engine-core(模板引擎)这个依赖。</li>\r\n" + 
				"<li>准备工作：</li>\r\n" + 
				"</ol>\r\n" + 
				"<ul>\r\n" + 
				"<li>选择主键策略，就是在上边最开始时候我介绍MP配置时其中的这项配置，如果你不记得了，请上翻！MP提供了如下几个主键策略：\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>IdType.AUTO</td>\r\n" + 
				"<td>数据库ID自增</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>IdType.INPUT</td>\r\n" + 
				"<td>用户输入ID</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>IdType.ID_WORKER</td>\r\n" + 
				"<td>全局唯一ID，内容为空自动填充（默认配置）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>IdType.UUID</td>\r\n" + 
				"<td>全局唯一ID，内容为空自动填充</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<p><span style=\"color: #ff0000;\">MP默认使用的是ID_WORKER，这是MP在Sequence的基础上进行部分优化，用于产生全局唯一ID。</span></p>\r\n" + 
				"</li>\r\n" + 
				"<li>表及字段命名策略选择，同上，还是在那个配置中。下边这段复制至MP官方文档：\r\n" + 
				"<p>在MP中，我们建议<code>数据库表名</code>采用<code>下划线命名方式</code>，而<code>表字段名</code>采用<code>驼峰命名方式</code>。</p>\r\n" + 
				"<p>这么做的原因是为了避免在对应实体类时产生的性能损耗，这样字段不用做映射就能直接和实体类对应。当然如果项目里不用考虑这点性能损耗，那么你采用下滑线也是没问题的，只需要在生成代码时配置<code>dbColumnUnderline</code>属性就可以。</p>\r\n" + 
				"</li>\r\n" + 
				"<li>建表(命名规则依照刚才你所配置的，这会影响生成的代码的类名、字段名是否正确)。</li>\r\n" + 
				"<li>执行下边的main方法，生成代码：\r\n" + 
				"<pre name=\"code\" class=\"java\">import java.util.HashMap;\r\n" + 
				"import java.util.Map;\r\n" + 
				"\r\n" + 
				"import com.baomidou.mybatisplus.generator.AutoGenerator;\r\n" + 
				"import com.baomidou.mybatisplus.generator.InjectionConfig;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.DataSourceConfig;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.GlobalConfig;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.PackageConfig;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.StrategyConfig;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.rules.DbType;\r\n" + 
				"import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;\r\n" + 
				"\r\n" + 
				"/**\r\n" + 
				" * &lt;p&gt;\r\n" + 
				" * 代码生成器演示\r\n" + 
				" * &lt;/p&gt;\r\n" + 
				" */\r\n" + 
				"public class MpGenerator {\r\n" + 
				"\r\n" + 
				"    /**\r\n" + 
				"     * &lt;p&gt;\r\n" + 
				"     * MySQL 生成演示\r\n" + 
				"     * &lt;/p&gt;\r\n" + 
				"     */\r\n" + 
				"    public static void main(String[] args) {\r\n" + 
				"        AutoGenerator mpg = new AutoGenerator();\r\n" + 
				"\r\n" + 
				"        // 全局配置\r\n" + 
				"        GlobalConfig gc = new GlobalConfig();\r\n" + 
				"        gc.setOutputDir(\"D://\");\r\n" + 
				"        gc.setFileOverride(true);\r\n" + 
				"        gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false\r\n" + 
				"        gc.setEnableCache(false);// XML 二级缓存\r\n" + 
				"        gc.setBaseResultMap(true);// XML ResultMap\r\n" + 
				"        gc.setBaseColumnList(false);// XML columList\r\n" + 
				"    // .setKotlin(true) 是否生成 kotlin 代码\r\n" + 
				"        gc.setAuthor(\"Yanghu\");\r\n" + 
				"\r\n" + 
				"        // 自定义文件命名，注意 %s 会自动填充表实体属性！\r\n" + 
				"        // gc.setMapperName(\"%sDao\");\r\n" + 
				"        // gc.setXmlName(\"%sDao\");\r\n" + 
				"        // gc.setServiceName(\"MP%sService\");\r\n" + 
				"        // gc.setServiceImplName(\"%sServiceDiy\");\r\n" + 
				"        // gc.setControllerName(\"%sAction\");\r\n" + 
				"        mpg.setGlobalConfig(gc);\r\n" + 
				"\r\n" + 
				"        // 数据源配置\r\n" + 
				"        DataSourceConfig dsc = new DataSourceConfig();\r\n" + 
				"        dsc.setDbType(DbType.MYSQL);\r\n" + 
				"        dsc.setTypeConvert(new MySqlTypeConvert(){\r\n" + 
				"            // 自定义数据库表字段类型转换【可选】\r\n" + 
				"            @Override\r\n" + 
				"            public DbColumnType processTypeConvert(String fieldType) {\r\n" + 
				"                System.out.println(\"转换类型：\" + fieldType);\r\n" + 
				"        // 注意！！processTypeConvert 存在默认类型转换，如果不是你要的效果请自定义返回、非如下直接返回。\r\n" + 
				"                return super.processTypeConvert(fieldType);\r\n" + 
				"            }\r\n" + 
				"        });\r\n" + 
				"        dsc.setDriverName(\"com.mysql.jdbc.Driver\");\r\n" + 
				"        dsc.setUsername(\"root\");\r\n" + 
				"        dsc.setPassword(\"521\");\r\n" + 
				"        dsc.setUrl(\"jdbc:mysql://127.0.0.1:3306/mybatis-plus?characterEncoding=utf8\");\r\n" + 
				"        mpg.setDataSource(dsc);\r\n" + 
				"\r\n" + 
				"        // 策略配置\r\n" + 
				"        StrategyConfig strategy = new StrategyConfig();\r\n" + 
				"    // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意\r\n" + 
				"        strategy.setTablePrefix(new String[] { \"tlog_\", \"tsys_\" });// 此处可以修改为您的表前缀\r\n" + 
				"        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略\r\n" + 
				"        // strategy.setInclude(new String[] { \"user\" }); // 需要生成的表\r\n" + 
				"        // strategy.setExclude(new String[]{\"test\"}); // 排除生成的表\r\n" + 
				"        // 自定义实体父类\r\n" + 
				"        // strategy.setSuperEntityClass(\"com.baomidou.demo.TestEntity\");\r\n" + 
				"        // 自定义实体，公共字段\r\n" + 
				"        // strategy.setSuperEntityColumns(new String[] { \"test_id\", \"age\" });\r\n" + 
				"        // 自定义 mapper 父类\r\n" + 
				"        // strategy.setSuperMapperClass(\"com.baomidou.demo.TestMapper\");\r\n" + 
				"        // 自定义 service 父类\r\n" + 
				"        // strategy.setSuperServiceClass(\"com.baomidou.demo.TestService\");\r\n" + 
				"        // 自定义 service 实现类父类\r\n" + 
				"        // strategy.setSuperServiceImplClass(\"com.baomidou.demo.TestServiceImpl\");\r\n" + 
				"        // 自定义 controller 父类\r\n" + 
				"        // strategy.setSuperControllerClass(\"com.baomidou.demo.TestController\");\r\n" + 
				"        // 【实体】是否生成字段常量（默认 false）\r\n" + 
				"        // public static final String ID = \"test_id\";\r\n" + 
				"        // strategy.setEntityColumnConstant(true);\r\n" + 
				"        // 【实体】是否为构建者模型（默认 false）\r\n" + 
				"        // public User setName(String name) {this.name = name; return this;}\r\n" + 
				"        // strategy.setEntityBuilderModel(true);\r\n" + 
				"        mpg.setStrategy(strategy);\r\n" + 
				"\r\n" + 
				"        // 包配置\r\n" + 
				"        PackageConfig pc = new PackageConfig();\r\n" + 
				"        pc.setParent(\"com.baomidou\");\r\n" + 
				"        pc.setModuleName(\"test\");\r\n" + 
				"        mpg.setPackageInfo(pc);\r\n" + 
				"\r\n" + 
				"        // 注入自定义配置，可以在 VM 中使用 cfg.abc 【可无】\r\n" + 
				"        InjectionConfig cfg = new InjectionConfig() {\r\n" + 
				"            @Override\r\n" + 
				"            public void initMap() {\r\n" + 
				"                Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();\r\n" + 
				"                map.put(\"abc\", this.getConfig().getGlobalConfig().getAuthor() + \"-mp\");\r\n" + 
				"                this.setMap(map);\r\n" + 
				"            }\r\n" + 
				"        };\r\n" + 
				"\r\n" + 
				"        // 自定义 xxList.jsp 生成\r\n" + 
				"        List&lt;FileOutConfig&gt; focList = new ArrayList&lt;FileOutConfig&gt;();\r\n" + 
				"        focList.add(new FileOutConfig(\"/template/list.jsp.vm\") {\r\n" + 
				"            @Override\r\n" + 
				"            public String outputFile(TableInfo tableInfo) {\r\n" + 
				"                // 自定义输入文件名称\r\n" + 
				"                return \"D://my_\" + tableInfo.getEntityName() + \".jsp\";\r\n" + 
				"            }\r\n" + 
				"        });\r\n" + 
				"        cfg.setFileOutConfigList(focList);\r\n" + 
				"        mpg.setCfg(cfg);\r\n" + 
				"\r\n" + 
				"    // 调整 xml 生成目录演示\r\n" + 
				"         focList.add(new FileOutConfig(\"/templates/mapper.xml.vm\") {\r\n" + 
				"            @Override\r\n" + 
				"            public String outputFile(TableInfo tableInfo) {\r\n" + 
				"                return \"/develop/code/xml/\" + tableInfo.getEntityName() + \".xml\";\r\n" + 
				"            }\r\n" + 
				"        });\r\n" + 
				"        cfg.setFileOutConfigList(focList);\r\n" + 
				"        mpg.setCfg(cfg);\r\n" + 
				"\r\n" + 
				"        // 关闭默认 xml 生成，调整生成 至 根目录\r\n" + 
				"        TemplateConfig tc = new TemplateConfig();\r\n" + 
				"        tc.setXml(null);\r\n" + 
				"        mpg.setTemplate(tc);\r\n" + 
				"\r\n" + 
				"        // 自定义模板配置，可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改，\r\n" + 
				"        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置，也可以自定义模板名称\r\n" + 
				"        // TemplateConfig tc = new TemplateConfig();\r\n" + 
				"        // tc.setController(\"...\");\r\n" + 
				"        // tc.setEntity(\"...\");\r\n" + 
				"        // tc.setMapper(\"...\");\r\n" + 
				"        // tc.setXml(\"...\");\r\n" + 
				"        // tc.setService(\"...\");\r\n" + 
				"        // tc.setServiceImpl(\"...\");\r\n" + 
				"    // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。\r\n" + 
				"        // mpg.setTemplate(tc);\r\n" + 
				"\r\n" + 
				"        // 执行生成\r\n" + 
				"        mpg.execute();\r\n" + 
				"\r\n" + 
				"        // 打印注入设置【可无】\r\n" + 
				"        System.err.println(mpg.getCfg().getMap().get(\"abc\"));\r\n" + 
				"    }\r\n" + 
				"\r\n" + 
				"}</pre>\r\n" + 
				"<span style=\"color: #ff0000;\">&nbsp;说明：中间的内容请自行修改，注释很清晰。</span></li>\r\n" + 
				"</ul>\r\n" + 
				"<p>成功生成代码，将生成的代码拷贝到你的项目中就可以了，这个东西节省了我们大量的时间和精力！</p>\r\n" + 
				"<p>&nbsp;</p>\r\n" + 
				"<p><span style=\"font-size: 36px; color: #ff0000;\">下边我将介绍MP提供的很有意思的插件：</span></p>\r\n" + 
				"<ol>\r\n" + 
				"<li>分页插件：插件的配置请看上边开篇时的MP配置部分。\r\n" + 
				"<pre name=\"code\" class=\"java\">public interface UserMapper{//可以继承或者不继承BaseMapper\r\n" + 
				"    /**\r\n" + 
				"     * &lt;p&gt;\r\n" + 
				"     * 查询 : 根据state状态查询用户列表，分页显示\r\n" + 
				"     * &lt;/p&gt;\r\n" + 
				"     *\r\n" + 
				"     * @param page\r\n" + 
				"     *            翻页对象，可以作为 xml 参数直接使用，传递参数 Page 即自动分页\r\n" + 
				"     * @param state\r\n" + 
				"     *            状态\r\n" + 
				"     * @return\r\n" + 
				"     */\r\n" + 
				"    List&lt;User&gt; selectUserList(Pagination page, Integer state);\r\n" + 
				"}</pre>\r\n" + 
				"&nbsp;\r\n" + 
				"<pre name=\"code\" class=\"java\">public Page&lt;User&gt; selectUserPage(Page&lt;User&gt; page, Integer state) {\r\n" + 
				"    page.setRecords(userMapper.selectUserList(page, state));\r\n" + 
				"    return page;\r\n" + 
				"}</pre>\r\n" + 
				"&nbsp;\r\n" + 
				"<pre name=\"code\" class=\"java\">&lt;select id=\"selectUserList\" resultType=\"User\"&gt;\r\n" + 
				"    SELECT * FROM user WHERE state=#{state}\r\n" + 
				"&lt;/select&gt;</pre>\r\n" + 
				"&nbsp;</li>\r\n" + 
				"<li>乐观锁插件：当要更新一条记录的时候，希望这条记录没有被别人更新过。\r\n" + 
				"<p>其实原理很简单：</p>\r\n" + 
				"<ul>\r\n" + 
				"<li>取出记录时，获取当前version</li>\r\n" + 
				"<li>更新时，带上这个version</li>\r\n" + 
				"<li>执行更新时， set version = yourVersion+1 where version = yourVersion</li>\r\n" + 
				"<li>如果version不对，就更新失败</li>\r\n" + 
				"</ul>\r\n" + 
				"<p>&nbsp;<span style=\"font-size: 1em;\">插件的配置请看上边开篇时的MP配置部分，使用该插件的表必须拥有能够作为version的字段，比如update_date：</span></p>\r\n" + 
				"<pre name=\"code\" class=\"java\">public class User {\r\n" + 
				"\r\n" + 
				"    @Version\r\n" + 
				"    private Integer version;\r\n" + 
				"\r\n" + 
				"    ...\r\n" + 
				"}</pre>\r\n" + 
				"<p><span style=\"font-size: 1em;\">&nbsp;说明：version</span><span style=\"font-size: 1em;\">仅支持int,Integer,long,Long,Date,Timestamp类型。</span></p>\r\n" + 
				"<pre name=\"code\" class=\"java\">int id = 100;\r\n" + 
				"int version = 2;\r\n" + 
				"\r\n" + 
				"User u = new User();\r\n" + 
				"u.setId(id);\r\n" + 
				"u.setVersion(version);\r\n" + 
				"u.setXXX(xxx);\r\n" + 
				"\r\n" + 
				"if(userService.updateById(u)){\r\n" + 
				"    System.out.println(\"Update successfully\");\r\n" + 
				"}else{\r\n" + 
				"    System.out.println(\"Update failed due to modified by others\");\r\n" + 
				"}\r\n" + 
				"//等价于:<span style=\"color: #525252; font-family: 'Roboto Mono', Monaco, courier, monospace; font-size: 12.8px; background-color: #f8f8f8;\">update tbl_user set name='update',version=3 where id=100 and version=2;\r\n" + 
				"</span></pre>\r\n" + 
				"</li>\r\n" + 
				"<li>执行分析插件，作用是分析处理 DELETE UPDATE 语句， 防止小白或者恶意 delete update 全表操作，不推荐生产环境使用。具体配置请看上边开篇时的MP配置部分。</li>\r\n" + 
				"<li>性能分析插件，用于输出每条 SQL 语句及其执行时间，不推荐生产环境使用。具体配置请看上边开篇时的MP配置部分。</li>\r\n" + 
				"<li>xml热加载插件，具体配置请看上边开篇时的MP配置部分。</li>\r\n" + 
				"</ol>\r\n" + 
				"<p><span style=\"color: #ff0000; font-size: 36px;\">好了，插件介绍到这，以下是注解说明，摘自官方文档：</span></p>\r\n" + 
				"<h2 id=\"注解说明\"><span>注解说明</span></h2>\r\n" + 
				"<blockquote>\r\n" + 
				"<p>表名注解&nbsp;<code>@TableName</code></p>\r\n" + 
				"</blockquote>\r\n" + 
				"<ul>\r\n" + 
				"<li>com.baomidou.mybatisplus.annotations.TableName</li>\r\n" + 
				"</ul>\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>value</td>\r\n" + 
				"<td>表名（ 默认空 ）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>resultMap</td>\r\n" + 
				"<td>xml 字段映射 resultMap ID</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<blockquote>\r\n" + 
				"<p>主键注解&nbsp;<code>@TableId</code></p>\r\n" + 
				"</blockquote>\r\n" + 
				"<ul>\r\n" + 
				"<li>com.baomidou.mybatisplus.annotations.TableId</li>\r\n" + 
				"</ul>\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>value</td>\r\n" + 
				"<td>字段值（驼峰命名方式，该值可无）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>type</td>\r\n" + 
				"<td>主键 ID 策略类型（ 默认 INPUT ，全局开启的是 ID_WORKER ）</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<p class=\"tip\">暂不支持组合主键</p>\r\n" + 
				"<blockquote>\r\n" + 
				"<p>字段注解&nbsp;<code>@TableField</code></p>\r\n" + 
				"</blockquote>\r\n" + 
				"<ul>\r\n" + 
				"<li>com.baomidou.mybatisplus.annotations.TableField</li>\r\n" + 
				"</ul>\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>value</td>\r\n" + 
				"<td>字段值（驼峰命名方式，该值可无）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>el</td>\r\n" + 
				"<td>详看注释说明</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>exist</td>\r\n" + 
				"<td>是否为数据库表字段（ 默认 true 存在，false 不存在 ）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>strategy</td>\r\n" + 
				"<td>字段验证 （ 默认 非 null 判断，查看 com.baomidou.mybatisplus.enums.FieldStrategy ）</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>fill</td>\r\n" + 
				"<td>字段填充标记 （ FieldFill, 配合自动填充使用 ）</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<ul>\r\n" + 
				"<li>字段填充策略 FieldFill</li>\r\n" + 
				"</ul>\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>DEFAULT</td>\r\n" + 
				"<td>默认不处理</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>INSERT</td>\r\n" + 
				"<td>插入填充字段</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>UPDATE</td>\r\n" + 
				"<td>更新填充字段</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>INSERT_UPDATE</td>\r\n" + 
				"<td>插入和更新填充字段</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<blockquote>\r\n" + 
				"<p>序列主键策略 注解&nbsp;<code>@KeySequence</code></p>\r\n" + 
				"</blockquote>\r\n" + 
				"<ul>\r\n" + 
				"<li>com.baomidou.mybatisplus.annotations.KeySequence</li>\r\n" + 
				"</ul>\r\n" + 
				"<table>\r\n" + 
				"<thead>\r\n" + 
				"<tr><th>值</th><th>描述</th></tr>\r\n" + 
				"</thead>\r\n" + 
				"<tbody>\r\n" + 
				"<tr>\r\n" + 
				"<td>value</td>\r\n" + 
				"<td>序列名</td>\r\n" + 
				"</tr>\r\n" + 
				"<tr>\r\n" + 
				"<td>clazz</td>\r\n" + 
				"<td>id的类型</td>\r\n" + 
				"</tr>\r\n" + 
				"</tbody>\r\n" + 
				"</table>\r\n" + 
				"<blockquote>\r\n" + 
				"<p>乐观锁标记注解&nbsp;<code>@Version</code></p>\r\n" + 
				"</blockquote>\r\n" + 
				"<ul>\r\n" + 
				"<li>com.baomidou.mybatisplus.annotations.Version</li>\r\n" + 
				"</ul>\r\n" + 
				"<p class=\"tip\">排除非表字段、查看文档常见问题部分！</p>\r\n" + 
				"<p>&nbsp;</p>\r\n" + 
				"<p>&nbsp;</p>\r\n" + 
				"<p><span style=\"color: #ff0000; font-size: 18px;\">&nbsp; &nbsp; &nbsp;总结：MP的宗旨是简化开发，但是它在提供方便的同时却容易造成代码层次混乱，我们可能会把大量数据逻辑写到service层甚至contoller层中，使代码难以阅读。凡事过犹不及，在使用MP时一定要做分析，不要将所有数据操作都交给MP去实现。毕竟MP只是mybatis的增强工具，它并没有侵入mybatis的原生功能，在使用MP的增强功能的同时，原生mybatis的功能依然是可以正常使用的。</span></p>\r\n" + 
				"<p>&nbsp;</p>\r\n" + 
				"</div>";
		
		String str2=htmlToText(str);
		System.out.println(str2);
	}
}
